package com.lncg.service.impl;

import com.lncg.entity.DeviceReceiveData;
import com.lncg.mapper.DeviceReceiveDataMapper;
import com.lncg.service.IDeviceReceiveDataService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 设备接收数据服务实现类
 */
@Service
public class DeviceReceiveDataServiceImpl implements IDeviceReceiveDataService {
    
    private static final Logger logger = LoggerFactory.getLogger(DeviceReceiveDataServiceImpl.class);
    
    @Autowired
    private DeviceReceiveDataMapper deviceReceiveDataMapper;
    
    /**
     * 处理设备数据（异步）
     * 1. 检查wm_device_recive_data表中是否有该IMEI
     * 2. 如果有就更新所有数据，如果没有就新插入
     * 3. 所有数据都插入wm_device_recive_data_his历史表
     * 
     * 注意：使用@Async注解，避免阻塞Netty I/O线程
     * 
     * @param deviceData 设备数据
     * @return 处理结果（CompletableFuture）
     */
    @Override
    @Async
    @Transactional(rollbackFor = Exception.class)
    public CompletableFuture<Boolean> processDeviceDataAsync(DeviceReceiveData deviceData) {
        try {
            logger.info("开始处理设备数据，IMEI: {}", deviceData.getImei());
            
            // 1. 先插入历史表（所有数据都要插入历史表）
            int historyResult = deviceReceiveDataMapper.insertToHistory(deviceData);
            if (historyResult <= 0) {
                logger.error("插入历史表失败，IMEI: {}", deviceData.getImei());
                return CompletableFuture.completedFuture(false);
            }
            logger.info("成功插入历史表，IMEI: {}", deviceData.getImei());
            
            // 2. 使用UPSERT操作：插入或更新主表（基于IMEI）
            logger.info("执行UPSERT操作，IMEI: {}", deviceData.getImei());
            int upsertResult = deviceReceiveDataMapper.upsertByImei(deviceData);
            if (upsertResult <= 0) {
                logger.error("UPSERT主表失败，IMEI: {}", deviceData.getImei());
                return CompletableFuture.completedFuture(false);
            }
            logger.info("成功UPSERT主表，IMEI: {}，影响行数: {}", deviceData.getImei(), upsertResult);
            
            logger.info("设备数据处理完成，IMEI: {}", deviceData.getImei());
            return CompletableFuture.completedFuture(true);
            
        } catch (Exception e) {
            logger.error("处理设备数据异常，IMEI: {}, 错误信息: {}", deviceData.getImei(), e.getMessage(), e);
            return CompletableFuture.completedFuture(false);
        }
    }
    
    /**
     * 处理设备数据（同步方法，保持兼容性）
     * @param deviceData 设备数据
     * @return 处理结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean processDeviceData(DeviceReceiveData deviceData) {
        try {
            logger.info("开始处理设备数据（同步），IMEI: {}", deviceData.getImei());
            
            // 1. 先插入历史表（所有数据都要插入历史表）
            int historyResult = deviceReceiveDataMapper.insertToHistory(deviceData);
            if (historyResult <= 0) {
                logger.error("插入历史表失败，IMEI: {}", deviceData.getImei());
                return false;
            }
            logger.info("成功插入历史表，IMEI: {}", deviceData.getImei());
            
            // 2. 使用UPSERT操作：插入或更新主表（基于IMEI）
            logger.info("执行UPSERT操作，IMEI: {}", deviceData.getImei());
            int upsertResult = deviceReceiveDataMapper.upsertByImei(deviceData);
            if (upsertResult <= 0) {
                logger.error("UPSERT主表失败，IMEI: {}", deviceData.getImei());
                return false;
            }
            logger.info("成功UPSERT主表，IMEI: {}，影响行数: {}", deviceData.getImei(), upsertResult);
            
            logger.info("设备数据处理完成（同步），IMEI: {}", deviceData.getImei());
            return true;
            
        } catch (Exception e) {
            logger.error("处理设备数据异常（同步），IMEI: {}, 错误信息: {}", deviceData.getImei(), e.getMessage(), e);
            throw new RuntimeException("处理设备数据失败", e);
        }
    }
    
    /**
     * 根据IMEI查询设备数据
     * @param imei 设备IMEI
     * @return 设备数据
     */
    @Override
    public DeviceReceiveData getDeviceDataByImei(String imei) {
        try {
            return deviceReceiveDataMapper.findByImei(imei);
        } catch (Exception e) {
            logger.error("查询设备数据异常，IMEI: {}, 错误信息: {}", imei, e.getMessage(), e);
            return null;
        }
    }
    
    /**
     * 获取所有设备数据
     * @return 设备数据列表
     */
    @Override
    public List<DeviceReceiveData> getAllDeviceData() {
        try {
            return deviceReceiveDataMapper.findAll();
        } catch (Exception e) {
            logger.error("查询所有设备数据异常，错误信息: {}", e.getMessage(), e);
            return null;
        }
    }
}
